/*
 * @Author: scl
 * @Date: 2023-09-14 11:52:53
 * @LastEditTime: 2023-09-14 14:51:59
 * @Description: file content
 */
/**
 * 添加拦截器
 *  拦截request请求
 *  拦截UN普拉多File文件上传
 * 
 * TODO：
 *  1.非http开头需要拼接地址
 *  2.请求超时
 *  3.添加小程序端请求头标识
 *  4.添加token请求头标识
*/
import { useMemberStore } from '@/stores'
const baseURL = "https://pcapi-xiaotuxian-front-devtest.itheima.net"

const httpInterceptor = {
    //拦截前触发
    invoke(args: UniApp.RequestOptions) {
        //1.非http开头需要拼接地址
        if (!args.url.startsWith('http')) args.url = baseURL + args.url
        // 2.请求超时
        args.timeout = 10000
        // 3.添加小程序端请求头标识
        args.header = {
            ...args.header,
            'source-client': 'miniapp'
        }
        //  4.添加token请求头标识
        const menberStore = useMemberStore()
        const token = menberStore.profile?.token
        if (token) {
            args.header.Authorization = token
        }

    }
}
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

/**
 * 请求函数
 * @param UniApp.RequestOptions
 * @returns Promise
 *  1.返回promise对象
 *  2.请求成功
 *      2.1 提取核心数据，res.data
 *      2.2 添加类型，支持泛型
 *  3.请求失败
 *      3.1 网络错误 -> 提示用户更换网络
 *      3.2 401错误 -> 清理用户信息，跳转到登录页
 *      3.3 其他错误 -> 根据后端错误信息轻提示
 */
interface PData<T> {
    code: string,
    msg: string,
    result: T
}
export const http = <T>(args: UniApp.RequestOptions) => {
    return new Promise<PData<T>>((resolve, reject) => {
        uni.request({
            ...args,
            success(res) {
                if (res.statusCode >= 200 && res.statusCode < 300) resolve(res.data as PData<T>)
                else if (res.statusCode == 401) {
                    const memberStore = useMemberStore()
                    memberStore.clearProfile()
                    uni.navigateTo({ url: "/pages/login/login" })
                    reject(res)
                } else {
                    uni.showToast({
                        icon: "none",
                        title: (<PData<T>>res.data).msg || "请求错误"
                    })
                    reject(res)
                }
                // resolve(res)
            },
            fail(err) {
                uni.showToast({
                    icon: "none",
                    title: "网络错误，更跟换网络"
                })
                reject(err)
            }
        })
    })
}